namespace RadioTimer.Services
{
    /// <summary>
    /// 文本转语音服务实现类
    /// 实现ITextToSpeechService接口，使用MAUI Essentials的TextToSpeech API
    /// 提供跨平台的文本转语音功能，支持音量控制和错误处理
    /// </summary>
    public class TextToSpeechService : ITextToSpeechService
    {
        #region 私有字段
        
        /// <summary>
        /// 默认播放音量，范围0.0-1.0
        /// </summary>
        private double _volume = 1.0;
        
        #endregion

        #region 公共方法
        
        /// <summary>
        /// 异步播放文本语音
        /// 使用MAUI Essentials的TextToSpeech API实现跨平台的语音播放
        /// </summary>
        /// <param name="text">要播放的文本内容</param>
        /// <param name="volume">播放音量，范围0.0-1.0，默认为1.0</param>
        /// <returns>异步任务</returns>
        public async Task SpeakAsync(string text, double volume = 1.0)
        {
            Services.DebugLogger.WriteLine($"开始文本转语音播放: {text}");
            try
            {
                // 创建语音选项，设置音量并限制在有效范围内
                var speechOptions = new SpeechOptions()
                {
                    Volume = (float)Math.Max(0, Math.Min(1, volume))
                };

                // 调用系统的文本转语音服务
                await TextToSpeech.SpeakAsync(text, speechOptions);
            }
            catch (Exception ex)
            {
                // 记录错误信息但不抛出异常，避免影响主程序运行
                Services.DebugLogger.WriteError($"Error in text-to-speech: {ex.Message}");
            }
        }

        /// <summary>
        /// 异步检查文本转语音功能是否可用
        /// 通过检查可用的语言包来判断功能可用性
        /// </summary>
        /// <returns>返回true表示功能可用，false表示不可用</returns>
        public async Task<bool> IsAvailableAsync()
        {
            Services.DebugLogger.WriteLine("开始检查文本转语音功能是否可用");
            try
            {
                // 获取可用的语言包列表
                var locales = await TextToSpeech.GetLocalesAsync();
                // 如果有可用的语言包，则认为功能可用
                return locales?.Any() == true;
            }
            catch
            {
                // 发生异常时返回false，表示功能不可用
                return false;
            }
        }

        /// <summary>
        /// 设置默认播放音量
        /// 自动限制音量值在有效范围内（0.0-1.0）
        /// </summary>
        /// <param name="volume">音量值，范围0.0-1.0</param>
        public void SetVolume(double volume)
        {
            // 限制音量值在有效范围内
            _volume = Math.Max(0, Math.Min(1, volume));
        }
        
        #endregion
    }
}